1、多路复用简介
	多路复用即同时等待多个IO，当某些IO发生相应的事件后则对其进行对应的操作。
2、应用层多路复用
	在应用层可以通过poll、select、epoll来实现多路复用，在使用poll、select、epoll进行多路复用时
强烈建议常用非阻塞方式打开相应的IO，以免错误操作导致IO卡死
3、驱动层的多路复用
	应用层的poll、select、epoll最终都会调用到驱动层的unsigned int (*poll) (struct file *, struct
poll_table_struct *)接口
4、驱动层的多路复用框架
	要使驱动支持多路复用只需要在驱动层实现对应的poll函数即可，如下是驱动中poll函数的固定框架：
	unsigned int xxx_poll(struct file *filp, struct poll_table_struct *p)
	{
		unsigned int mask = 0;
		
		//调用poll_wait，将进程加入到可能会改变进程状态的等待队列中，并将等待队列的信息添加到以poll_table扩
		//展的数据结构中，此函数不会引起进程休眠
		poll_wait(filp, &wq, p);
		poll_wait(filp, &rq, p);
		......
		
		//如果发生读事件
		//POLLIN 通常等价 POLLRDNORM ，表示发生读事件，即驱动有数据可读
		if(...)
			mask |= POLLIN | POLLRDNORM;
		
		//如果发生写事件
		//POLLOUT 通常等价 POLLWRNORM ，表示发生写事件，即驱动可以接受应用层数据
		if(...)
			mask |= POLLOUT | POLLWRNORM;
		
		//返回相应的事件，没有发生任何事件则返回0
		return mask;
	}
